﻿/*+========================================================
File:		Bill.h
Sumary:		Định nghĩa đối tượng Bill Razer, đối tượng 
			chính của Game
========================================================+*/

#pragma once
#include "GameObject.h"
#include "Gun.h"
#include "BossOneHeart.h"

#define BILL_SPEED_X 115.0f
#define BILL_SPEED_Y 350.0f

/*C+==================================================================
Class:    CBill

Summary:  Lớp CBill dùng để định nghĩa các thuộc tính và phương thức
của đối tượng Bill Razer
==================================================================-C*/
class CBill : public CMoveableObject
{
public:
	// Trạng thái của bill.
	enum Status
	{
		Ground,     // Trạng thái đứng trên đất.
		Jump,       // Trạng thái nhảy.
		Lay,        // Trạng thái nằm trên đất.
		Fall,       // Trạng thái rơi.
		Swim,       // Trạng thái bơi.
		GrassUp,    // Trạng thái leo lên bờ.
		Dying,      // Trạng thái đang chết, để thực hiện animation.
		Die,        // Trạng thái chết.
	};
	// Hướng của bill.
	enum Direction
	{
		None,      // Khi ko nhấn phím nào.
		Forward,   // Khi nhấn phím LEFT, RIGHT.
		Up,        // Khi nhấn phím UP.
		Down,      // Khi nhấn phím DOWN.
		Top,       // Khi nhấn phím LEFT+UP, RIGHT+UP.
		Bot,       // Khi nhấn phím LEFT+DOWN, RIGHT+DOWN.
	};
private:

	Status m_status;         // Trạng thái của bill.

	Direction m_direction;   // Hướng của bill

	bool m_bIsRight;        // Xác định vị trí của sprite để vẽ.

	bool m_bIsFiring;       // Biến xác định bill có đang bắn ko.

	float m_timeChange;    // Thời gian chờ để chuyển trạng thái.

	float m_bCanFall;      // Biến xác định xem bill có thể fall khi đang nằm trên đất hay ko.

	float m_timeDie;		// Thời gian để thực hiện animation chết.

	float m_timeReset;		// Thời gian để reset lại bill khi bill mới chết.

	float m_timeImmortal;		// Thời gian để bất tử khi vừa reset lại bill.

	bool m_bIsImmortal;        // Biến xác định trạng thái bất tử của bill.

	bool m_cheatImmortal;

	int m_nCount;            // Biến đếm để thực hiện animation khi bill vừa reset.

	int m_nCountCollision;   // Biến xác định bill hết va chạm với đất.

	CGun* m_pGun;		   // Súng của Bill

	bool m_bIsChangeScene; //Biến cờ kiểm tra Bill có đang chuyển màn

	bool m_bCSJump;

	bool m_bInitPS;

	float m_fTimeDestroy;

	bool m_bIsResetPS;

	bool m_bIsDestroyed;

	CSound* m_pSound;

	CTexture* m_pTextureBox;

	D3DXVECTOR2 m_curPos;

	/*M+==================================================================
	Method:	    CBill::UpdateStateChanging

	Summary:	Phương thức cập nhật các biến trạng thái cho bill.

	Params:		timeFrame - Thời gian chuyển Frame
	==================================================================-M*/
	void UpdateStateChanging(float timeFrame);

	/*M+==================================================================
	Method:	    CBill::UpdateKeyboard

	Summary:	Phương thức thực hiện kiểm tra bàn phím và tạo ra các thao tác
	tương ứng

	Params:		input - Con trỏ CInput chứa thông tin phím của Bill
	timeFrame - Thời gian chuyển Frame
	==================================================================-M*/
	void UpdateKeyboard(float timeFrame);

	/*M+==================================================================
	Method:	    CBill::UpdateAnimation

	Summary:	Phương thức cập nhật các animation tương ứng cho đối tượng Bill

	Params:		timeFrame - Thời gian chuyển Frame
	==================================================================-M*/
	void UpdateAnimation(float timeFrame);

	/*M+==================================================================
	Method:	    CBill::Fire

	Summary:	Phương thức bắn.

	Params:		timeFrame - Thời gian chuyển Frame.
	==================================================================-M*/
	void Fire();

	/*M+==================================================================
	Method:	    CBill::Reset

	Summary:	Phương thức reset lại trạng thái của bill khi bị chết.
	==================================================================-M*/
	void Reset();

	void RespondTopGroundCollision(CGameObject* gameObject, float topTime);
	void RespondLeftGroundCollision(CGameObject* gameObject, float leftTime);
	void RespondRightGroundCollision(CGameObject* gameObject, float rightTime);


public:

	/*M+==================================================================
	Method:	    CBill::CBill

	Summary:	Phương thức khởi tạo.

	Params: pos - Vị trí của đối tượng
	id  - ID của đối tượng
	typeID - ID của loại đối tượng
	==================================================================-M*/
	CBill(D3DXVECTOR2 pos, int id, int typeID);

	/*M+==================================================================
	Method:	    CBill::~CBill

	Summary:	Phương thức hủy.
	==================================================================-M*/
	~CBill();

	/*M+==================================================================
	Method:	    CBill::Update

	Summary:	Phương thức cập nhật trạng thái cho đối tượng Bill

	Params:		input - Con trỏ CInput chứa thông tin phím của Bill
	timeFrame - Thời gian chuyển Frame
	==================================================================-M*/
	void Update(float timeFrame);

	void UpdateBox(float timeFrame);

	void UpdateCollision(vector<CGameObject*> vecGameObjs, float timeFrame);

	Status GetBillStatus()
	{
		return m_status;
	}

	int GetBillLives()
	{
		return m_nLife;
	}

	/*M+==================================================================
	Method:	    CBill::Draw

	Summary:	Phương thức vẽ đối tượng Bill

	Params:		viewport - Đối tượng Viewport để vẽ theo tọa độ thế giới thật
	==================================================================-M*/
	void Draw();

	bool Kill();

	//Hàm kiểm tra Bill có đang quay sang phải không
	bool IsRight()
	{
		return m_bIsRight;
	}
	//Hàm gán giá trị đang chuyển màn cho Bill
	void SetChangingScene(bool flag)
	{
		m_bIsChangeScene = flag;
	}

	//Hàm lấy giá trị đang chuyển màn của Bill

	bool GetChangingScene()
	{
		return m_bIsChangeScene;
	}

	//Hàm lấy về kiểu đạn hiện tại của Bill
	int GetCurrentBulletType()
	{
		return m_pGun->GetCurBulletType();
	}

	//Hàm hủy diệt tất cả đối tượng (khi ăn item eagle)
	void DestroyAll(float timeFrame, vector<CGameObject*> aCollisionObject);
};
